/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package server;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import mail.Message;
import mail.Usuario;

/**
 *
 * @author Lab-214-21
 */
public class MailServer implements Serializable {

    private  ListaMensaje lista;
    private  ListaUsuario listausuario;
    int secuencia;
    public String archivo;
/**
 * Constructor que inicializa la lista de mail
 */
    public MailServer(String archivo) {
        lista = new ListaMensaje();
        secuencia = 1;
        listausuario= new ListaUsuario();
        this.archivo= archivo;
    }
    /**
     * Metodo que devuelve todos los usuarios
     * @return Lista de Usuarios
     */
    public ListaUsuario ListaUsuario() {
        return listausuario;
    }
    
   /**
    * 
    * @param name nombre del usuario conectado
    * @return Devuelve la cantidad de mensajes de un usuario especifico 
    */
    public int getMessagesWaiting(String name) {
        int cantidad = 0;
        Iterator it = lista.iterar();
        while (it.hasNext()) {
            Message objeto = (Message) it.next();
            String mensajes = objeto.mostrarMensaje();
            String V[] = mensajes.split(",");
            if (V[1].equals(name)) {
                cantidad = cantidad + 1;
            }
        };

        return cantidad;
    }

    /**
     * 
     * @param name Nombre de usuario
     * @return Devuelva todos los mensajes del usuario especifico 
     */
    private ArrayList<Message> obtenerMensajesRecibidos(String name) {
        ArrayList listaNueva = new ArrayList();
        Iterator it = lista.iterar();

        while (it.hasNext()) {
            Message objeto = (Message) it.next();
            String mensajes = objeto.mostrarMensaje();
            String V[] = mensajes.split(",");
            if (V[1].equals(name)) {
                listaNueva.add(objeto);
            }
        };

        return listaNueva;
    }
     /**
     * 
     * @param name Nombre de usuario
     * @return Devuelva todos los mensajes del usuario especifico 
     */
    public ArrayList<Message> getMensajesNuevos(String name) {
        ArrayList<Message> lista= obtenerMensajesRecibidos(name);
        ArrayList<Message> salida= new ArrayList<>();
            for (int i = 0; i < lista.size(); i++) {
                String estado=lista.get(i).Estado();
                if (estado.equals("nuevo"))
                    salida.add(lista.get(i));
                    
            }
            return salida;
    }
    
     /**
     * 
     * @param name Nombre de usuario
     * @return Devuelva todos los mensajes del usuario especifico 
     */
    public ArrayList<Message> getMensajesLeidos(String name) {
        ArrayList<Message> lista= obtenerMensajesRecibidos(name);
        ArrayList<Message> salida= new ArrayList<>();
            for (int i = 0; i < lista.size(); i++) {
                String estado=lista.get(i).Estado();
                if (estado.equals("leido"))
                    salida.add(lista.get(i));
                    
            }
            return salida;
    }
    
     /**
     * 
     * @param name Nombre de usuario
     * @return Devuelva todos los mensajes del usuario especifico 
     */
    public ArrayList<Message> getMensajesEliminados(String name) {
        ArrayList<Message> lista= obtenerMensajesRecibidos(name);
        ArrayList<Message> salida= new ArrayList<>();
            for (int i = 0; i < lista.size(); i++) {
                String estado=lista.get(i).Estado();
                if (estado.equals("eliminado"))
                    salida.add(lista.get(i));
                    
            }
            return salida;
    }
    /**
     * 
     * @param name Nombre de usuario
     * @return  Devuelve el primer mensaje de un usuario especifico
     */
    public Message getNextMessage(String name) {
        
        Iterator it = obtenerMensajesRecibidos(name).iterator();
        int i = 1;
        Message mensaje = null;
        while (it.hasNext()) {
            Message objeto = (Message) it.next();
            if (i == secuencia) {
                mensaje = objeto;
                secuencia = secuencia + 1;
                break;
            }
            i = i + 1;
        };

        return mensaje;
    }
    /**
     *  Metodo que agrega a la lista el mensaje recibido
     * @param mensaje Objeto tipo Message 
     */
    public void post(Message mensaje) {
        lista.adicionar(mensaje);
    }
    /**
     * Metodo que agregar un usuario al server
     * @param nombre Nombre de Usuario
     */
    public void addUsuario(String nombre){
     Usuario u= new Usuario(nombre);
     listausuario.adicionar(u);
    }
    
    /**
     * Metodo que elimina un usuario al server
     * @param nombre Nombre de Usuario
     */
    public void deleteUsuario(String nombre){
     
     listausuario.eliminar(nombre);
    }
    
    /**
     * Metodo que verifica si existe el usuario en el Servidor
     * @param name Nombre de usuario
     * @return true or false
     */
    public boolean existe(String name){
        Iterator it = listausuario.iterar();

        while (it.hasNext()) {
            Usuario objeto = (Usuario) it.next();
            String nombre = objeto.getNombre();
            
            if (name.equals(nombre)) {
                return true;
            }
        };
        return false;
    }
    /**
     * Metodo que guarda el servidor en un archivo
     */
    public void save(){
        try{
         FileOutputStream fs = new FileOutputStream(archivo);//Creamos el archivo
         ObjectOutputStream os = new ObjectOutputStream(fs);//Esta clase tiene el método writeObject() que necesitamos
         os.writeObject(this);//El método writeObject() serializa el objeto y lo escribe en el archivo
         //os.writeObject(a2);
         os.close();//Hay que cerrar siempre el archivo
      }catch(FileNotFoundException e){
         e.printStackTrace();
      }catch(IOException e){
         e.printStackTrace();
      }
    }
    /**
     * Metodo que devuelve el Mailserver actualizado
     * @return Object MailServer
     */
    public MailServer refresh(){
         try{
   
                FileInputStream fis = new FileInputStream(archivo);
                ObjectInputStream ois = new ObjectInputStream(fis);
                MailServer server= (MailServer) ois.readObject();
                ois.close();
                return server;
               
                
              
      }catch(FileNotFoundException e){
         e.printStackTrace();
      }catch(IOException e){
         e.printStackTrace();
      }catch(ClassNotFoundException e){
         e.printStackTrace();
      }
         return null;
    }
}
